import fs from "fs"
import path from "path"

// 設定資產目錄路徑
const assetsDir = path.resolve(process.cwd(), "src/assets/images")
const typesDir = path.resolve(process.cwd(), "src/types")
const constantsDir = path.resolve(process.cwd(), "src/constants")
const outputTypeFile = path.join(typesDir, "asset_key.d.ts")
const outputSvgMapFile = path.join(constantsDir, "svg_map.ts")

/**
 * 遞迴掃描資產目錄並收集所有檔案路徑
 */
function scanAssets(
    dir: string,
    basePath: string = "",
    result: { regular: string[]; svg: string[] } = { regular: [], svg: [] },
): { regular: string[]; svg: string[] } {
    const files = fs.readdirSync(dir)

    for (const file of files) {
        const filePath = path.join(dir, file)
        const stat = fs.statSync(filePath)

        if (stat.isDirectory()) {
            // 如果是目錄，則遞迴掃描
            scanAssets(filePath, path.join(basePath, file), result)
        } else {
            // 如果是檔案，則加入結果
            const relativePath = path.join(basePath, file)
            const normalizedPath = relativePath.replace(/\\/g, "/")

            // 分別收集 SVG 和其他檔案
            if (path.extname(file).toLowerCase() === ".svg") {
                result.svg.push(normalizedPath)
            } else {
                result.regular.push(normalizedPath)
            }
        }
    }

    return result
}

/**
 * 生成資產鍵類型定義檔案
 */
function generateAssetKeysTypeDefinition(assetPaths: { regular: string[]; svg: string[] }): string {
    const regularKeysUnion = assetPaths.regular.map((path) => `"${path}"`).join(" | ")
    const svgKeysUnion = assetPaths.svg.map((path) => `"${path}"`).join(" | ")

    return `// 自動生成的檔案，請勿直接修改
// 由 tools/generate_asset_keys.ts 產生

declare module "custom/asset_key" {
  type AssetKey = ${regularKeysUnion || '""'};
  
  type AssetKeySvg = ${svgKeysUnion || '""'};

  export { AssetKeySvg };
  export default AssetKey;
}
`
}

/**
 * 生成 SVG 懶加載映射檔案
 */
function generateSvgMapFile(svgPaths: string[]): string {
    const imports = `import { lazy } from "react";\nimport { AssetKeySvg } from "custom/asset_key";\n\n`

    const svgMapEntries = svgPaths
        .map((path) => `  "${path}": lazy(() => import("@/assets/images/${path}?react"))`)
        .join(",\n")

    return `// @ts-nocheck
/* eslint-disable @typescript-eslint/no-explicit-any */
${imports}/**
 * SVG 懶加載映射
 * 自動生成的檔案，請勿直接修改
 */
const svgMap: Record<AssetKeySvg, React.LazyExoticComponent<any>> = {
${svgMapEntries}
};

export default svgMap;
`
}

/**
 * 主函式 - 掃描資產目錄並生成類型定義檔案
 */
function main() {
    try {
        // 確保 types 目錄存在
        if (!fs.existsSync(typesDir)) {
            fs.mkdirSync(typesDir, { recursive: true })
        }
        // 確保 constants 目錄存在
        if (!fs.existsSync(constantsDir)) {
            fs.mkdirSync(constantsDir, { recursive: true })
        }

        // 掃描資產目錄
        const assetPaths = scanAssets(assetsDir)

        // 生成類型定義
        const typeDefinition = generateAssetKeysTypeDefinition(assetPaths)

        // 生成 SVG 懶加載映射檔案
        const svgMapContent = generateSvgMapFile(assetPaths.svg)

        // 寫入檔案
        fs.writeFileSync(outputTypeFile, typeDefinition, "utf8")
        fs.writeFileSync(outputSvgMapFile, svgMapContent, "utf8")

        console.log(`✅ 成功產生資產鍵類型定義: ${outputTypeFile}`)
        console.log(`✅ 成功產生 SVG 懶加載映射: ${outputSvgMapFile}`)
        console.log(`找到 ${assetPaths.regular.length} 個一般資產檔案`)
        console.log(`找到 ${assetPaths.svg.length} 個 SVG 資產檔案`)
    } catch (error) {
        console.error("❌ 產生資產鍵相關檔案失敗:", error)
        process.exit(1)
    }
}

// 執行主函式
main()
